23066
1974
Jag listar över kontakter från webbtjänsten och visar den i kontakternas "sektionerade" tabellvy som visas på skärmdumpen.
Problemet är att jag får samma taggvärden för kryssrutorna i första raden för avsnitt A såväl som avsnitt S. Jag har sorterat en array och visas i den indexerade tabellvyn. Hur man får olika taggvärden beroende på indexPath.row oavsett antal sektioner som visas. Här är vad jag försökte
I cellForRowAtIndexPath:
UIButton * checkBox;
om (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPhone)
{
checkBox = [[UIButton alloc] initWithFrame: CGRectMake (7, 8, 30, 30)];
}
annan
{
checkBox = [[UIButton alloc] initWithFrame: CGRectMake (15, 13, 30, 30)];
}
// int cnt = 0;
// för (int i = indexPath.section - 1; i> 0; i--)
// {
// cnt + = [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: i]] count]; // arrayOfCharachters har "A" till "Z"
//}
//checkBox.tag = cnt + indexPath.row;
[checkBox setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal];
[checkBox addTarget: self action: @selector (checkBoxClicked :) forControlEvents: UIControlEventTouchUpInside];
[checkBox setTag: indexPath.row];
[cell.contentView addSubview: checkBox];
returcell;
}
- (ogiltigt) checkBoxClicked: (id) avsändare
{
CGPoint buttonPosition = [avsändare convertPoint: CGPointZero toView: self.tableViewContact];
NSIndexPath * indexPath = [self.tableViewContact indexPathForRowAtPoint: buttonPosition];
UIButton * tappedButton = (UIButton *) avsändare;
NSLog (@ "Taggnummer =% d", [avsändarkod]);
if ([tappedButton.currentImage isEqual: [UIImage imageNamed: @ "checkBox.png"]])
{
[sender setImage: [UIImage imageNamed: @ "checkBoxMarked.png"] forState: UIControlStateNormal];
if (indexPath! = Nil)
{
NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; // lagra kryssrutan id i mutableArrayOfIds
NSLog (@ "Taggad markerad knapp id =% @", finalIntId);
[arrayOfIds addObject: finalIntId];
}
// NSString * finalIntId = [mutableArrayOfIds objectAtIndex: tappedButton.tag];
// NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row];
}
annan
{
[sender setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal];
NSLog (@ "Okontrollerad");
// [arrayOfIds removeObjectAtIndex: tappedButton.tag];
}
}
- (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) avsnitt {
if ([arrayOfCharacters count] == ​​0)
{
lämna tillbaka @"";
}
returnera [NSString stringWithFormat: @ "% @", [arrayOfCharacters objectAtIndex: avsnitt]];
}
- (NSArray *) avsnittIndexTitlesForTableView: (UITableView *) tableView
{
NSArray * toBeReturned = [NSArray arrayWithArray:
[@ "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | # "
componentsSeparatedByString: @ "|"]];
återgå till BeReturned;
}
- (NSInteger) tableView: (UITableView *) tableView sectionForSectionIndexTitle: (NSString *) title atIndex: (NSInteger) index
{
NSInteger count = 0;
för (NSString * karaktär i arrayOfCharacters) {
om ([karaktär isEqualToString: titel]) {
returräkning;
}
räkna ++;
}
returnera 0;
}
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView
{
returnera [arrayOfCharacters count];
// return 1;
}
- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) avsnitt
{
// returnera [mutableArray count];
return [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: section]] count];
} 
du ställer in samma taggvärde för alla sektioner som har samma rad.
IndexPath har två egenskaper, {sektion, rad}.
Låt oss säga att avsnitt A har två rader,
för rad1 -> indexPath.section = 0, indexPath.row = 0;
för rad2-> indexPath.section = 0, indexPath.row = 1;
Låt oss säga att avsnitt S har två rader,
för rad1 -> indexPath.section = 1, indexPath.row = 0;
för rad2-> indexPath.section = 1, indexPath.row = 1;
Så för rad 1 i avsnitt A och rad 1 i avsnitt S ställer du in samma taggvärde som är 0. Det är ditt problem.
Prova att ställa in taggvärde som nedan.
button.tag = indexPath.section * 1000 + indexPath.row;
när du hämtar sektionen och raden,
NSInteger sektion = (button.tag) / 1000;
NSInteger row = (button.tag)% 1000;
|
Prova detta...
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
statisk NSString * CellIdentifier = @ "Cell";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
om (cell == noll) {
cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier];
}
UIButton * checkBox = [[UIButton alloc] initWithFrame: CGRectMake (280, 10, 50, 44)];
checkBox.backgroundColor = [UIColor orangeColor];
[checkBox addTarget: self action: @selector (checkBoxClicked: event:) forControlEvents: UIControlEventTouchUpInside];
[checkBox setTag: indexPath.row];
[cell.contentView addSubview: checkBox];
returcell;
}
- (ogiltigt) checkBoxClicked: (id) avsändarhändelse: (id) händelse
{
NSSet * touches = [event allTouches];
UITouch * touch = [berör anyObject];
CGPoint currentTouchPosition = [peka locationInView: self.tv]; // här är tv TableView-objekt
NSIndexPath * indexPath = [self.tv indexPathForRowAtPoint: currentTouchPosition];
NSLog (@ "värde för indePath.section% d, indexPath.row% d", indexPath.section, indexPath.row);
}
|
Detta händer eftersom du tilldelar tagg till knappar OBEROENDE av sektioner.
Båda första raderna i sektioner A och S har rad = 0. så Tagg tilldelad till respektive knapp är 0. Du bör tilldela dem Håll referens till dina avsnitt.
Jag skulle föreslå att tilldela tillgänglighetstips med kommaseparerad form som innehåller avsnitt, rad.
Och i din metod
- (ogiltigt) checkBoxClicked: (id) avsändare
{
// välj sträng från kommaseparerad form. 1: a är din sektion, 2: a är rad.
}
andra alternativet är vad du än gör och implementera din knappmetod så här.
CGPoint buttonPosition = [avsändare convertPoint: CGPointZero toView: self.tableView];
NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: buttonPosition];
om (indexPath! = noll)
{
... indexpath.section är ditt avsnitt, index path.row är din rad.
}
Det finns också det tredje alternativet.
i cellforRowAtIndexpath tilldela din knapp en titel
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
[btn setTitle: <# Your Row #> forState: UIControlStateDisabled];
[btn setTag <#Ditt avsnitt #>];
så vid mottagning i din knappmetod kan du ha både avsnitt (tagg) och rad (titel för inaktiverat tillstånd).
- (ogiltig) checkBoxClicked: (id) avsändare {[knapptitelForState: UIControlStateDisabled]; // din rad
button.tag // ditt avsnitt}
|
Prova detta!
Varje sektion kanske du känner till antalet av sektioner till höger och lägg sedan till antalet individuella rader.
[[fieldTitlesList objectAtIndex: indexPath.section - 1] count] + indexPath.row
Där fieldTitlesList är matrisen för dina sektioner.
|
Jag lade till följande kod som löste mitt problem
NSInteger rowNumber = 0;
för (NSInteger i = 0; i